
import java.util.Random;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author jairo
 */
public class Mundo {
	private Estado[][][] delta;
	private int[][][] reward;
	private boolean[][] goal;
	
	Mundo (){
		delta = new Estado[6][6][4];
		reward = new int[6][6][4];
		goal = new boolean[6][6];
		for(int i = 1; i < 5; i++){
			for (int j = 1; j < 5; j++){
				delta[i][j][0] = new Estado(i-1,j); // arriba
				delta[i][j][1] = new Estado(i,j+1); // derecha
				delta[i][j][2] = new Estado(i+1,j); // abajo
				delta[i][j][3] = new Estado(i,j-1); // izquierda
			}
		}
		//borde superior
		for(int j = 1; j< 5; j++){
			delta[0][j][1] = new Estado(0,j+1); // derecha
			delta[0][j][2] = new Estado(1,j); // abajo
			delta[0][j][3] = new Estado(0,j-1); // izquierda
		}
		// borde inferior
		for(int j = 1; j< 5; j++){
			delta[5][j][0] = new Estado(4,j); // arriba
			delta[5][j][1] = new Estado(5,j+1); // derecha
			delta[5][j][3] = new Estado(5,j-1); // izquierda
		}
		// borde izq
		for(int i = 1; i< 5; i++){
			delta[i][0][0] = new Estado(i-1,0); // arriba
			delta[i][0][1] = new Estado(i,1); // derecha
			delta[i][0][2] = new Estado(i+1,0); // abajo
		}
		// borde derecho
		for(int i = 1; i< 5; i++){
			delta[i][5][0] = new Estado(i-1,5); // derecha
			delta[i][5][2] = new Estado(i-1,5); // abajo
			delta[i][5][3] = new Estado(i,4); // izquierda
		}	
		// esquinas
		delta[0][0][1] = new Estado(0,1); // derecha
		delta[0][0][2] = new Estado(1,0); // abajo
				
		delta[0][5][2] = new Estado(1,5); //abajo
		delta[0][5][3] = new Estado(0,4); //izquierda
				
		delta[5][0][0] = new Estado(4,0); // arriba
		delta[5][0][1] = new Estado(5,1); // derecha
			
		delta[5][5][0] = new Estado(4,5); // arriba
		delta[5][5][3] = new Estado(5,4); // izquierda
	
		// seteo de recompensas
		for(int i = 0; i < 6; i++){
			for (int j = 0; j < 6; j++){
				reward[i][j][0] = 0; // arriba
				reward[i][j][1] = 0; // derecha
				reward[i][j][2] = 0; // abajo
				reward[i][j][3] = 0; // izquierda
			}
		}	
		
		reward[1][1][1] = -20;
		reward[1][2][2] = 80;
		reward[1][3][2] = 80;
		reward[1][4][3] = -20;
		reward[4][2][0] = 20;
		reward[4][3][0] = 20;	
		
		
		// estados objetivo
		for(int i = 0; i < 6; i++){
			for (int j = 0; j < 6; j++){
				goal[i][j] = false;
			}
		}
		
		goal[2][2] = true;
		goal[2][3] = true;
		goal[3][2] = true;
		goal[3][3] = true;
		// faltan los casos borde
	}
	
	int getReward(int estadoX, int estadoY,int accion){
		return reward[estadoX][estadoY][accion];
	}
	
	Estado getEstado(int estadoX, int estadoY,int accion){
		return delta[estadoX][estadoY][accion];
	}
	
	boolean getEsGoal(Estado estado){
		return goal[estado.getX()][estado.getY()];
	}
	
	Estado elegirEAleatorio() {

		int rEstadoI = 3;
		int rEstadoJ = 3;
		while (goal[rEstadoI][rEstadoJ]) {
			Random rEstadoX = new Random();
			Random rEstadoY = new Random();
			rEstadoI = rEstadoX.nextInt(6);
			rEstadoJ = rEstadoY.nextInt(6);
		}
		return new Estado(rEstadoI, rEstadoJ);
	}
	
	int elegirAAleatoria(Estado estado){
		int a;
		if (estado.getX() == 0 && estado.getY() == 0) {
			Random rAccion = new Random();
			a = rAccion.nextInt(2) + 1;
		} else if(estado.getX() == 0 && estado.getY() == 5){
			Random rAccion = new Random();
			a = rAccion.nextInt(2) + 2;			
		} else if(estado.getX() == 5 && estado.getY() == 0) {
			Random rAccion = new Random();
			a = rAccion.nextInt(2);			
		} else if(estado.getX() == 5 && estado.getY() == 5){
			Random rAccion = new Random();
			a = ((rAccion.nextInt(2) + 3) % 4);			
		} else if (estado.getX() == 0) {
			Random rAccion = new Random();
			a = rAccion.nextInt(3) + 1;			
		} else if (estado.getX() == 5) {
			Random rAccion = new Random();
			a = ((rAccion.nextInt(3) + 3) % 4);				
		} else if (estado.getY() == 0) {
			Random rAccion = new Random();
			a = rAccion.nextInt(3);				
		} else if (estado.getY() == 5) {
			Random rAccion = new Random();
			a = ((rAccion.nextInt(3) + 2) % 4);				
		} else {
			Random rAccion = new Random();
			a = rAccion.nextInt(4);
		}
		return a;
	}
	
}
